import 'dart:math';
/**
 * dart 中的异步处理
 * 
 *  async 和 awit
 * 
 * 异步函数定义:
 * 
 *  函数名() async {
 *    函数体
 *  }
 * 
 * 多个异步函数顺序执行
 * 
 *  (() async { 
 *    await 异步任务1();
 *    await 异步任务2();
 *    ...
 *  }())
 * 
 * 前后任务之间传值
 * 
 *  前一个任务函数 return 返回值
 *  后一项任务 (参数) async {  }
 * 
 * 调用时:
 * 
 *  (() async {
 *    var ret = await 任务1();
 *     await 任务2(ret);
 *  }())
 * 
 * 错误处理：使用 try catch 处理异常
 * 
 */
// 定义异步函数
liang() async {
  var bang = "===接力棒===";
  print("亮拿着$bang起跑...");
  await Future.delayed(Duration(seconds: 6));
  print("亮拿着$bang到达终点");
  return bang;
}

// 定义异步函数
ran(bang) async {
  print("然拿着$bang起跑...");
  await Future.delayed(Duration(seconds: 4));
  
  var rdm = Random();
  if (rdm.nextDouble() < 0.6) {
    print("然拿着$bang到达终点");
    return bang;
  } else {
    throw Exception("bia~然摔倒了");
  }
  
}

// 定义异步函数
dong(bang) async {
  print("东拿着$bang起跑...");
  await Future.delayed(Duration(seconds: 2));
  print("东拿着$bang到达终点");
}

// 入口主函数
void main() {
  (() async {
    try {
      var bang = await liang();
      bang = await ran(bang);
      await dong(bang);
      print("比赛顺利结束");
    } catch(e) {
      print("比赛暂停: $e");
    }
    
  }());
}
